package main

import (
	"log"
	"net/http"
	"video_server/api/handlers"

	"github.com/julienschmidt/httprouter"
)

// ----------   拦截层，主要是拦截 校验session   start --------------------------------

// 拿到 httprouter.Router ，然后把这个 httprouter.Router 传入到中间层，这个中间层可以做一部分我们自己的校验逻辑

// middleWareHandler 定义一个结构体， 相当于是一个中间转换层
type middleWareHandler struct {
	r *httprouter.Router
}

// NewMiddleWareHandler 创建一个中间转换层
func NewMiddleWareHandler(r *httprouter.Router) http.Handler {
	// 创建这个结构体
	m := middleWareHandler{}
	// 把 httprouter.Router 路由赋值
	m.r = r
	return m
}

// 定义一个 ServeHTTP 来做拦截层
// 会自动调用这个 ServeHTTP 函数，相当于重写原来的 http.Handler 里面的 ServeHTTP 函数
func (m middleWareHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	log.Printf("开始拦截session")

	// 这里还可以做其他的逻辑

	// 检查session
	validateUserSession(r)

	// 调用 httprouter.Router 里面的 ServeHTTP 函数,使请求继续往下走
	m.r.ServeHTTP(w, r)

}

// --------------------  拦截层，主要是拦截 校验session   end -------------------------------

// RegisterHandlers 创建路由
func RegisterHandlers() *httprouter.Router {
	// 创建一个 http路由
	router := httprouter.New()

	router.POST("/user", handlers.CreateUser)
	router.POST("/user/:user_name", handlers.Login)

	return router
}

func main() {

	// 在这里调用了 NewMiddleWareHandler 函数（做了一个中间转换层）
	// 但是这个 NewMiddleWareHandler 函数绑定了一个 自定义的 ServeHTTP 函数，就会默认的调用这个 我们自定义的 ServeHTTP 函数
	// 相当于我们把 http.handler 替换成了 我们的 NewMiddleWareHandler 函数，但是 ServeHTTP 函数名称要保持一致, 相当就是重写了这个 ServeHTTP 函数

	r := RegisterHandlers()
	mh := NewMiddleWareHandler(r)
	http.ListenAndServe(":9080", mh)

}
